﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Transactions;
using DTO;
using AutoMapper;

namespace DAO
{
    public class SachDAO
    {
        public static bool Them(SachDTO dto)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                //khởi tạo datacontext
                QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

                //tạo đối tượng
                Sach n = new Sach();

                //mapping
                Mapper.CreateMap<SachDTO, Sach>();
                n = Mapper.Map<SachDTO, Sach>(dto);

                //thêm vào ds khi nhấn submit
                context.Saches.InsertOnSubmit(n);

                //thực hiện thay đổi
                context.SubmitChanges();

                //Đọc dòng vừa ghi để lưu lại mã lên trên
                //dto.MaSach = n.MaSach;

                //transaction thành công
                scope.Complete();
            }
            return true;
        }

        public static List<SachDTO> DocDanhSach(int trangThai)
        {
            //tạo list
            List<SachDTO> list = new List<SachDTO>();

            //khởi tạo datacontext
            QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();
            var query = from n in context.Saches
                     select n;

            //trạng thái
            //1: mặc định đọc tất cả

            //chỉ đọc lên sách còn có thể sử dụng
            if (trangThai == 2)
                query = query.Where(p => p.MaTinhTrang == 1 || p.MaTinhTrang == 2);

            //đọc lên sách chưa thanh lý
            if (trangThai == 3)
                query = query.Where(p => p.MaTinhTrang != 6);

            //duyệt danh sách
            foreach (Sach n in query)
            {
                //mapping từ linQ vào dto
                SachDTO dto = new SachDTO();
                Mapper.CreateMap<Sach, SachDTO>();
                dto = Mapper.Map<Sach, SachDTO>(n);
                //thêm vào list
                list.Add(dto);
            }
            //trả về kq
            return list;
        }
        
        public static List<SachDTO> TraCuu(SachDTO s)
        {
            //tạo list
            List<SachDTO> list = new List<SachDTO>();

            //khởi tạo datacontext
            QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

            //// set up the "main query"
            //var test = from p in _db.test select _db.test;
            //// if str1 is not null, add a where-condition
            //if (str1 != null)
            //{
            //    test = test.Where(p => p.test == str);
            //}

            //truy vấn
            var query = from n in context.Saches
                        select n;

            //kiểm tra & thêm điều kiệt tra cứu
            if (s.MaTheLoai != 0)
                query = query.Where(p => p.MaTheLoai == s.MaTheLoai);

            if (s.MaTinhTrang != 0)
                query = query.Where(p => p.MaTinhTrang == s.MaTinhTrang);

            if (s.NamXuatBan != 0)
                query = query.Where(p => p.NamXuatBan == s.NamXuatBan);

            if (s.NhaXuatBan != "")
                query = query.Where(p => p.NhaXuatBan.Contains(s.NhaXuatBan));

            if (s.TenSach != "")
                query = query.Where(p => p.TenSach.Contains(s.TenSach));

            if (s.TenTacGia != "")
                query = query.Where(p => p.TenTacGia.Contains(s.TenTacGia));

            //duyệt danh sách
            foreach (Sach n in query)
            {
                //mapping từ linQ vào dto
                SachDTO dto = new SachDTO();
                Mapper.CreateMap<Sach, SachDTO>();
                dto = Mapper.Map<Sach, SachDTO>(n);
                //thêm vào list
                list.Add(dto);
            }
            //trả về kq
            return list;
        }

        public static bool GhiNhanMatSach(SachDTO dtoSach)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                //khởi tạo datacontext
                QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();
                //đọc thông tin sách từ csdl
                Sach s = context.Saches.Single(c => c.MaSach == dtoSach.MaSach);
                //cập nhật tình trạng
                s.MaTinhTrang = 4;

                //đưa thông tin vào dto
                dtoSach.MaTinhTrang = s.MaTinhTrang;

                //thực hiện thay đổi
                context.SubmitChanges();

                //transaction thành công
                scope.Complete();
            }

            return true;
        }
    }
}
